<?php
class Conf_importacion_excel extends MY_Controller {

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'Conf_importar_excel');

    	$this->title = 'Configuraciones :: Ajustes :: Importar Listas de Precios en Excel';
		$this->CARPETA_VISTAS = 'configuraciones/';
		$this->nombre_entidad = 'Configuración de Importación';
		$this->nombre_entidad_plural = 'Configuraciones de Importación';

		$this->pagina_editar = $this->CARPETA_VISTAS . 'config_importar_excel_edit_view';
		$this->pagina_ver = $this->CARPETA_VISTAS . 'config_importar_ver_todos_view';
		$this->pagina_filtros_ver = $this->CARPETA_VISTAS . 'config_importar_filtros_ver_todos_view';

		$this->exportarExcelPermitido = FALSE;
		$this->genero_entidad = 'F';
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Crea un objeto de la entidad correspondiente y lo pobla con la información obtenida a 
	 * partir del formulario recibido a través de POST.	*/
	protected function getObjetoDesdeForm()
	{
		$idEntidad = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		
		$objEntidad = $this->getObjeto($idEntidad);
		$objEntidad->col_codigo = $this->input->post('txt_col_codigo');
		$objEntidad->col_importe_pesos = $this->input->post('txt_col_importe_pesos');
		$objEntidad->col_importe_dolares = $this->input->post('txt_col_importe_dolares');
		$objEntidad->cant_filas_cabecera = $this->input->post('txt_cant_filas_cabecera');
		$datos['objEntidad'] = $objEntidad;

		// Objetos relacionados: en este caso guardo directamente el id.
		$idProveedor = is_numeric($this->input->post('f_txt_proveedor_id')) ? $this->input->post('f_txt_proveedor_id') : NULL;
		$datos['objRelacionados'] = array(new Persona($idProveedor));

		return $datos;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
	 * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
	 * la entidad actual. Si no se requiriesen, no se agrega nada. */
	protected function cargarDatosRelacionados($dataView)
	{	
		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
	 * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)	*/	
	protected function _aplicarFiltros($dataView = array())
	{
		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$objEntidad = $this->getObjeto();
		$detalle_filtros = '';

		$proveedor = trim($this->input->post('f_txt_proveedor'));
		if(!empty($proveedor)) { 
			$objEntidad->like_related('persona', 'razon_social', $proveedor); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Proveedor => ' . $proveedor;
		}

		$dataView['objEntidad'] = $objEntidad;
		$dataView['detalle_filtros'] = $detalle_filtros;

		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
	protected function validarEliminacion($id_elemento)
	{
		return TRUE;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE. */
	protected function validarEdicion($id_elemento)
	{
		return TRUE;
	}

	public function subir_archivo()
	{
		// Intento guardar el archivo si hubiera
		$config['upload_path'] = './documentos/temporales';
		$config['allowed_types'] = 'xls|xlsx';
		
		$this->load->library('upload', $config);
		if (!$this->upload->do_upload()) {
			echo 'Error: ' . $this->upload->display_errors();
		}
		else {
			$datos_archivo = $this->upload->data();
			$path_archivo = $datos_archivo['full_path'];
			
			try {
				# Cargar vista previa del archivo
				$this->load->library('to_excel');
				$objPHPExcel = $this->to_excel->cargarExcel($path_archivo, TRUE, NULL, 0, 20);
				
				# Creo una tabla con la vista previa
				// Sólo me interesa una vista previa, así que muestro los títulos y 8 renglones más
				$cantFilas = $objPHPExcel->getActiveSheet()->getHighestRow();
				//if($cantFilas > 8) $cantFilas = 8;

				if($cantFilas > 0) {
					$cantColumnas = PHPExcel_Cell::columnIndexFromString($objPHPExcel->getActiveSheet()->getHighestColumn());
					$tablaHTML = '<table class="table table-hover" align="center">';
					
					for($columna = 0; $columna < $cantColumnas; $columna++) {
						# Inserto en la tabla antes de cada cabecera, el combo con las posibilidades
						$letraCol = PHPExcel_Cell::stringFromColumnIndex($columna);
						$opcionesCombo = array('0' => 'Ninguno', 'codigo' => 'Cód. Producto', 'importe_pesos' => 'Importe ($)', 'importe_dolares' => 'Importe (us$)');
						$tablaHTML .= '<td>' . form_dropdown('sel_campo', $opcionesCombo, array(), "class = 'form-control sel_campo' letraCol='$letraCol' onchange='establecerColumna(this)'") . '</td>';
					}
					
					for($fila = 0; $fila <= $cantFilas; $fila++){
						$tablaHTML .= '<tr>';
						for($columna = 0; $columna <= $cantColumnas; $columna++) {
							$tablaHTML .= '<td>' . 
											$objPHPExcel->getActiveSheet()->getCellByColumnAndRow($columna,$fila)->getFormattedValue() . 
										  '</td>';
						}
						$tablaHTML .= '</tr>';
					}
					$tablaHTML .= '</table>';
				}
			}
			catch(Exception $e) {
				echo 'Error: ' . $e->getMessage();
			}

			# Elimino el archivo de prueba utilizado
			if (file_exists($datos_archivo['full_path'])){
				unlink($datos_archivo['full_path']);
			}

			echo $tablaHTML;
		}
	}

	public function validarForm($datos = array())
	{	
		if($datos == array()) $datos = $this->getObjetoDesdeForm();
		$objEntidad = $datos['objEntidad'];
		$objRelacionados = $datos['objRelacionados'];
		$objEntidad->validate($objRelacionados);

		# Agrego las validaciones personalizadas para la carga de usuarios (Campos requeridos según tipo de edición)
		if(empty($objEntidad->col_importe_pesos) && empty($objEntidad->col_importe_dolares))
			$objEntidad->error->string .= "<i class='fa fa-times'></i> Debe indicar la columna donde se encuentra el importe.</br>";

		// Validar que cada proveedor tenga ÚNICAMENTE una sola configuración
		$id_proveedor = $objRelacionados[0]->id;
		if(!empty($id_proveedor) && $id_proveedor != NULL) {
			$objConfig = $this->getObjeto();
			$objConfig->where('persona_id', $id_proveedor);
			if($objEntidad->exists()) $objConfig->where('id !=', $objEntidad->id);
			if($objConfig->count() > 0) $objEntidad->error->string .= "<i class='fa fa-asterisk'></i> El Proveedor que se ha propuesto ya existe.</br>";
		}

		if($this->input->is_ajax_request()) echo $objEntidad->error->string;
		else return $objEntidad->error->string;
	}

	protected function setAyuda($dataView) {
		$dataView['ayuda_objetivo'] = 'Visualizar y configurar la importación de listas de precios en formato Excel por proveedor.';
		$dataView['descripcion_breve'] = 'Para automatizar la actualización de precios a partir de listas en formato Excel para un determinado proveedor, es necesario
											especificar de qué manera se debe realizar este proceso, indicando las columnas del Excel que tienen la información relevante 
											necesaria para llevarlo a cabo. Este formulario permite realizar esta configuración, es decir, especificar en qué columnas están 
											los códigos de producto, y los importes.';
		
		$dataView['boton_visualizar'] = TRUE;

		return $dataView;
	}
}